[IA64] implement free_irq_vector() paravirtualization
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Thu, 7 Dec 2006 11:15:54 +0000 (04:15 -0700)
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Thu, 7 Dec 2006 11:15:54 +0000 (04:15 -0700)
This avoids a double free error message since dom0 isn't
actually using the ia64_vector_mask.

Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c
linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c
xen/arch/ia64/xen/hypercall.c
xen/include/public/physdev.h

index d9b11edf96c829a5430f15aa2155f0949a6da86c..5cbfa260049f04f44f2703c79fb362072afb9b70 100644 (file)
@@ -197,6 +197,16 @@ int xen_assign_irq_vector(int irq)
 
        return irq_op.vector;
 }
+
+void xen_free_irq_vector(int vector)
+{
+       struct physdev_irq irq_op;
+
+       irq_op.vector = vector;
+       if (HYPERVISOR_physdev_op(PHYSDEVOP_free_irq_vector, &irq_op))
+               printk(KERN_WARNING "%s: xen_free_irq_vecotr fail vector=%d\n",
+                      __FUNCTION__, vector);
+}
 #endif /* XEN */
 
 /*
index c5bba01228225a4f46146d7050076e22c5454489..495eb496f52582c45774f62eeedf5a9d9c7485e5 100644 (file)
@@ -94,6 +94,13 @@ free_irq_vector (int vector)
        if (vector < IA64_FIRST_DEVICE_VECTOR || vector > IA64_LAST_DEVICE_VECTOR)
                return;
 
+#ifdef CONFIG_XEN
+       if (is_running_on_xen()) {
+               extern void xen_free_irq_vector(int);
+               xen_free_irq_vector(vector);
+               return;
+       }
+#endif
        pos = vector - IA64_FIRST_DEVICE_VECTOR;
        if (!test_and_clear_bit(pos, ia64_vector_mask))
                printk(KERN_WARNING "%s: double free!\n", __FUNCTION__);
index 58c6a411159e31f3ee19b42a6b05ba98fa74441a..15e9f5b26b5fa9c8b7bc1e304a41513b8f3610f5 100644 (file)
@@ -454,6 +454,29 @@ static long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
         break;
     }
 
+    case PHYSDEVOP_free_irq_vector: {
+        struct physdev_irq irq_op;
+        int vector;
+
+        ret = -EFAULT;
+        if ( copy_from_guest(&irq_op, arg, 1) != 0 )
+            break;
+
+        ret = -EPERM;
+        if ( !IS_PRIV(current->domain) )
+            break;
+
+        ret = -EINVAL;
+        vector = irq_op.vector;
+        if (vector < IA64_FIRST_DEVICE_VECTOR ||
+            vector > IA64_LAST_DEVICE_VECTOR)
+            break;
+        
+        free_irq_vector(vector);
+        ret = 0;
+        break;
+    }
+
     default:
         ret = -ENOSYS;
         break;
index 5692cee897c159b85a498662b4cc25bb0b92257d..6f78a09fe1e0e6963065e450a4db9cd4c3de138e 100644 (file)
@@ -152,6 +152,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_op_t);
 #define PHYSDEVOP_APIC_READ              PHYSDEVOP_apic_read
 #define PHYSDEVOP_APIC_WRITE             PHYSDEVOP_apic_write
 #define PHYSDEVOP_ASSIGN_VECTOR          PHYSDEVOP_alloc_irq_vector
+#define PHYSDEVOP_FREE_VECTOR            PHYSDEVOP_free_irq_vector
 #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
 #define PHYSDEVOP_IRQ_SHARED             XENIRQSTAT_shared